/*  -------------------------- (C) COPYRIGHT 2022 Fortiortech ShenZhen ---------------------------*/
/**
 * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
 * @file      xxx
 * @author    Fortiortech  Appliction Team
 * @since     Create:2022-07-14
 * @date      Last modify:2022-07-14
 * @note      Last modify author is Leo.li
 * @brief
 */

/* Define to prevent recursive inclusion --------------------------------------------------------*/
#ifndef __CUSTOMER_H_
#define __CUSTOMER_H_
// 20221130-功率稳定

/*芯片参数值-------------------------------------------------------------------*/
/*CPU and PWM Parameter*/
#define PWM_FREQUENCY (36.0) // (kHz) 载波频率
/*deadtime Parameter*/
#define PWM_DEADTIME (0.9) // (us) 死区时间
/*single resistor sample Parameter*/
#define MIN_WIND_TIME (1.6) // (us) 单电阻最小采样窗口，建议值死区时间+0.9us

#define Pole_Pairs (2.0)   // 极对数
#define LD (0.00115 * 1.0) // (H) D轴电感
#define LQ (0.00115 * 1.0) // (H) Q轴电感
#define RS (6.4 * 1.0)     // (Ω) 相电阻

/****AO 不需要Ke****/
#define Ke (1.0) // (V/KRPM) 反电动势常数

#define MOTOR_SPEED_BASE (180000.0) // (RPM) 速度基准
/*------------------------------------------------------------------------------*/

/**
 * 硬件PCBA参数设置根据驱动芯片的类型选择，6862为 HIGH_LEVEL
 * @param (High_Level)   驱动高电平有效
 * @param (Low_Level)    驱动高电平有效
 * @param (UP_H_DOWN_L)  驱动高电平有效
 * @param (UP_L_DOWN_H)  驱动高电平有效
 */
#define PWM_LEVEL_MODE (High_Level) ///< 驱动电平设置

/* 电机电流采样相关硬件参数 */

/**
 * @breaf  运放模式选择
 * @param (AMP_NOMAL)       外部放大
 * @param (AMP_PGA_DUAL)    内部PGA双端差分输入
 */
#define HW_AMP_MODE (AMP_PGA_DUAL) ///< 运放模式选择

#define HW_RSHUNT (0.10) ///< (Ω)  采样电阻

/**
 * 放大倍数设置
 * @param (AMP2x)       内部PGA放大2倍
 * @param (AMP4x)       内部PGA放大4倍
 * @param (AMP8x)       内部PGA放大8倍
 * @param (AMP16x)      内部PGA放大16倍
 * @param (xxxxxx)      外部放大模式填写相应倍数
 */
#define HW_AMPGAIN (AMP4x) ///< 放大倍数设置

/**
 * 参考电压设置
 * @param (VREF3_0)       参考电压设置为3.0V
 * @param (VREF4_0)       参考电压设置为4.0V
 * @param (VREF4_5)       参考电压设置为4.5V
 * @param (VREF5_0)       参考电压设置为5.0V
 */
#define HW_ADC_VREF (VREF5_0) ///< (V)  ADC参考电压

/**
 * 电流采样模式选择
 * @param (Single_Resistor)       单电阻电流采样模式
 * @param (Double_Resistor)       双电阻电流采样模式
 * @param (Three_Resistor)        三电阻电流采样模式
 */
#define Shunt_Resistor_Mode (Three_Resistor) ///< 电流采样模式选择

/**
 * 基准电压VREF对外输出使能
 * @param (Disable)       禁止
 * @param (Enable)       使能
 */
#define VREF_OUT_EN (Disable) ///< 基准电压VREF对外输出使能

/**
 * VHALF输出使能
 * @param (Disable)       禁止
 * @param (Enable)        使能
 */
#define VHALF_OUT_EN (Disable) ///< VHALF输出使能

/*hardware voltage sample Parameter*/
/*母线电压采样分压电路参数*/
#define RV1 (510.0) // (kΩ) 母线电压分压电阻1
#define RV2 (510.0) // (kΩ) 母线电压分压电阻2
#define RV3 (10)    // (kΩ) 母线电压分压电阻3
#define VC1 (0.85)  // 电压补偿系数

/*模式选择设置值----------------------------------------------------------------*/
/*IPM测试模式*/
#define IPMtest (0)   // IPM测试或者MOS测试，MCU输出固定占空比
#define NormalRun (1) // 正常按电机状态机运行
#define IPMState (NormalRun)

/**
 * 估算器模式选择
 * @param (SMO)       滑膜估算
 * @param (PLL)       锁相环
 * @param (AO)        自适应
 */
#define EstimateAlgorithm (AO) ///< 估算器模式选择

/**
 * 启动模式选择
 * @param (PLL_Start)           Observer启动
 * @param (Omega_Start)              Omega启动
 * @param (Open_Omega_Start)         先开环启，后Omega启动
 */
#define START_MODE (Omega_Start) ///< 开环启动模式选择

/**
 * @brief  预充电时间
 */
#define Charge_Time (60) // (ms) 预充电时间，单位：ms

/**
 * 顺逆风判断设置
 * @param (TailWind)      检测顺逆风
 * @param (NoTailWind)    不检测顺逆风
 */
#define TailWind_Mode (NoTailWind)

/**
 * 顺逆风判断方法
 * @param (FOCMethod)      FOC检测顺逆风
 * @param (BEMFMethod)     反电动势检测顺逆风
 */
#define FRDetectMethod (BEMFMethod)

/*逆风判断时的估算算法设置值-----------------------------------------------------*/
#define TailWind_Time (250) // (ms) 顺逆风检测时间
#define ATO_BW_Wind (150.0) // 逆风判断观测器带宽的滤波值，经典值为8.0-100.0
#define SPD_BW_Wind (10.0)  // 逆风判断速度带宽的滤波值，经典值为5.0-40.0

/**逆风顺风状态下的KP、KI****/
#define DQKP_TailWind _Q12(1.5)  //_Q12(1.0)-PLL ,   _Q12(1.5)   -smo
#define DQKI_TailWind _Q15(0.18) //_Q15(0.08)-PLL  ,_Q15(0.2)-smo

/*启动参数参数值----------------------------------------------------------------*/
/******* 初始位置检查参数 **********/
#define PosCheckEnable (0) // 初始位置使能
#define RPD_Time (1)       // (ms) 每次RPD的时间
#define RPD_CurValue (0.8) // (A)  RPD过流值
#define DAC_RPDCurValue (_Q8(I_ValueX((RPD_CurValue))))

/**
 * 预定位模式选择
 * @param (0)         正常预定位
 * @param (1)         测试模式，可用于手动测试电机极对数
 */
#define AlignTestMode (0) // 预定位测试模式
#define Align_Time (1)    // (ms) 预定位时间，单位：ms

/***预定位的Kp、Ki****/
#define DQKP_Alignment _Q12(0.006)      // 预定位的KP
#define DQKI_Alignment _Q12(0.001)      // 预定位的KI
#define ID_Align_CURRENT I_Value(0.004) // (A) D轴定位电流
#define IQ_Align_CURRENT I_Value(0.0)   // (A) Q轴定位电流
#define Align_Angle (0.0)               // (°) 预定位角度

/***启动电流****/
#define ID_Start_CURRENT I_Value(0.0) // (A) D轴启动电流
#define IQ_Start_CURRENT I_Value(0.9) // (A) Q轴启动电流

/***运行电流****/
#define ID_RUN_CURRENT I_Value(0.0) // (A) D轴运行电流
#define IQ_RUN_CURRENT I_Value(0.9) // (A) Q轴运行电流

/***PLL_Start parameters****/
#define Close_Speed (1600.0)          // (RPM) The speed switch to hardware angle estimator
#define E_BW_PLL (600.0)              // Bandwidth of PLL_Start estimator
#define ANGLE_COM _Q15(10.0 / 180.0)  // Angle compensation
#define ANGLE_COM1 _Q15(15.0 / 180.0) // Angle compensation
#define PLL_BEMF_BASE (1.5)           // Feedback gain of PLL_Start estimator
#define UDC_rated (310.0)             // Rated voltage of bus

/* 启动ATO参数 */
#define ATO_BW (0.0) // 观测器带宽的滤波值，经典值为1.0-200.0
#define ATO_BW_RUN (60.0)
#define ATO_BW_RUN1 (100.0)
#define ATO_BW_RUN2 (160.0)
#define ATO_BW_RUN3 (300.0)
// OMEGA启动参数
#define Motor_Omega_Ramp_ACC (30.0)   // omega 启动的增量   12 50
#define MOTOR_OMEGA_ACC_MIN (6000.0)  // (RPM) omega 启动的最小切换转速 4600
#define MOTOR_OMEGA_ACC_END (12000.0) // (RPM) omega 启动的限制转速     18000

#define MOTOR_SPEED_SMOMIN_RPM (7000.0) // (RPM) SMO运行最小转速

#define MOTOR_LOOP_RPM (16000.0) // (RPM) 由 mode0 到 mode1 切换转速，即闭环切换转速
#define SPD_BW (12.0)            // 速度带宽的滤波值，经典值为5.0-40.0

/*外环选择功率环或速度环*/
#define POWER_LOOP_CONTROL (0)   // 恒功率
#define SPEED_LOOP_CONTROL (1)   // 恒转速
#define CURRENT_LOOP_CONTROL (2) // 恒电流
#define Motor_Speed_Control_Mode (SPEED_LOOP_CONTROL)

/*外环使能*/
#define OUTLoop_Disable (0) // 关闭外环
#define OUTLoop_Enable (1)  // 使能外环
#define OUTLoop_Mode (OUTLoop_Enable)
/**
 * 闭环方式选择
 * @param (PWMMODE)       PWM调速（未添加）
 * @param (ONOFFTEST)     启停测试工具
 * @param (NONEMODE)      直接给定值，不调速
 * @param (KEYSCANMODE)   按键控制模式
 */
#define SPEED_MODE (KEYSCANMODE) ///< 闭环方式选择

/*转速参数值-------------------------------------------------------------------*/
/* motor run speed value */
// 电机运行时最大最小转速、堵转保护转速
#define MOTOR_SPEED_MIN_RPM (20000.0)  // (RPM) 运行最小转速
#define MOTOR_SPEED_MAX_RPM (105000.0) // (RPM) 运行最大转速
#define MOTOR_SPEED_STOP_RPM (60000.0) // (RPM) 运行最小转速

#define Motor_Max_Power (4000)
#define Motor_Min_Power (400)

/*******运行时的参数*****************/
/*电流环参数设置值--------------------------------------------------------------*/
#define DQKPStart _Q12(0.6)  // DQ轴KP
#define DQKIStart _Q15(0.01) // DQ轴KI

#define DQKP _Q12(3.5) // DQ轴KP
#define DQKI _Q15(1.6) // DQ轴KI

// 电流环的参数值
#define QOUTINC (1)       // Q轴电流增大步进值,开环控制时有效
#define QOUTCURRENT (0.3) // (A) Q轴输出电流,开环控制时有效
#define QOUTVALUE I_Value(QOUTCURRENT)

/* D轴参数设置 */
#define DOUTMAX _Q15(0.6)  // D轴最大限幅值，单位：输出占空比
#define DOUTMIN _Q15(-0.6) // D轴最小限幅值，单位：输出占空比
/* Q轴参数设置，默认0.99即可 */
#define QOUTMAX _Q15(0.98)  // Q轴最大限幅值，单位：输出占空比
#define QOUTMIN _Q15(-0.98) // Q轴最小限幅值，单位：输出占空比

#define QOUTMINST _Q15(0.00) // 启动时Q轴最小限幅

/*外环参数设置值----------------------------------------------------------------*/
#define SPEED_LOOP_TIME (1) // (ms) 速度环调节周期 风扇速度环50，功率环5
#define SKP _Q12(0.4)       // 外环KP
#define SKI _Q15(0.003)     // 外环KI

#define SOUTMAX0 I_Value(0.5) // (A) 外环最大限幅值
#define SOUTMAX I_Value(1.2)  // (A) 外环最大限幅值

#define SOUTMIN I_Value(0.05) // (A) 外环最小限幅值

#define SpeedRampInc S_Value(400) // （SPEED_LOOP_TIME）调节周期速度环增量
#define SpeedRampDec S_Value(300) // （SPEED_LOOP_TIME）调节周期速度环减量

/* -----弱磁设置----- */
#define MotorFiledWeakenEn (1)
#define MotorFiledWeakenUs _Q15(0.84) // 弱磁能到的最大饱和电压(弱磁转速上不去的时候可以调小该值)

#define MotorFiledWeakenKp _Q12(0.2)   // 弱磁控制的Kp
#define MotorFiledWeakenKi _Q15(0.003) // 弱磁控制的Ki

/**
 * IO 口控制转向
 * @param (Disable)      禁止
 * @param (Enable)       使能
 */
#define FREnable (Disable) // IO口控制正反转使能，调用正反控制时，确认 FRPin 设置是否与硬件一致
#define FRPin (GP07)       // 正反转引脚,如果方向不对可以直接在这里取反 GP05/ ~GP05
/**
 * 转向设置
 * @param (CW)        顺时针
 * @param (CCW)       逆时针
 */
#define FR_MODE (CCW) ///< 转向设置

/**
 * 测试模式下时间配置
 * @param (StartON_Time)       开启时间
 * @param (StartOFF_Time)      关闭时间
 */
#define StartON_Time (2000)  // (ms) 启动运行时间
#define StartOFF_Time (2000) // (ms) 停止时间

/**
 * 停机刹车
 * @param (Disable)       禁止
 * @param (Enable)        使能
 */
#define StopBrakeFlag (Enable) // 停机刹车使能
#define StopWaitTime (500)     // (ms) 刹车等待时间

/*************速度控制挡位******************/
// #define Motor_Speed_Low                         S_Value(80000)        //低挡转速
#define Motor_Speed_Mid S_Value(85500)   // 中挡转速93000
#define Motor_Speed_HIgh S_Value(102000) // 高挡转速

/******七段SVPWM启动五段SVPWM运行******/
#define SVPWM_5_Segment_Run_Enale (0) // 0:不使能 1:使能

#define Motor_F5SEG_Speed S_Value(63500) // 五段式切换速度阈值
#define Motor_F7SEG_Speed S_Value(61500) // 七段式切换速度阈值

/*************电机运行最大功率限制值******************/
#define POWERLPFLIMIT (9500) // 15800大概在110W左右
/*************温度控制挡位******************/
#define Temperature_Off (0x00)          // 关闭温度
// #define Temperature_Control_Period (20) // 温度控制周期

//  #define Speed_LowTemperature_LOW                (12)                       //低转速发热
//  #define Speed_LowTemperature_Mid                (16)
//  //#define Speed_LowTemperature_High               (15)

#define Speed_MidTemperature_LOW (52) // 中速发热
#define Speed_MidTemperature_Mid (70)
// #define Speed_MidTemperature_High               (14)

#define Speed_HIghTemperature_LOW (67) // 高速发热
#define Speed_HIghemperature_Mid (100)
// #define Speed_HIghemperature_MidNTCFault (14)
// #define Speed_HIghTemperature_High              (19)

#define Temperature_ADCLOW (13000) // NTC60度电阻值24K
#define Temperature_ADCMid (8000)  // NTC80度电阻值12K
#define Temperature_ADCHigh (5200) // NTC100度电阻值6.6K

/**
 * 恒温控制
 * @param (Disable)       禁止
 * @param (Enable)        使能
 */
#define ThermostaticENABLE (Disable) // 恒温控制使能

#endif
